이안의 평일코딩

JSP 4일차 - Express Language, JSTL / 게시판 본문

Back-end/JSP

JSP 4일차 - Express Language, JSTL / 게시판

이안92 2020. 10. 5. 09:57
반응형

2020.10.05 ,6(월, 화)

 

1. EL(Express Language) => 화면 출력

<%= %>

out.println()

=> 실무 : 자바, HTML(web) => 분리해서 사용

                        =========

                        자바에서 가지고 오는 데이터 출력 (HTML안에는 자바데이터를 출력할 수 있는 기능이 없다)

                         => 출력할 수 있는 기능을 제공 ==> EL

                        제어문 (HTML에는 존재하지 않는다) => 태그형식으로 제어문 제공 (JSTL)

                        EL + JSTL ==> 스프링에서는 출력용으로 사용

                        스프링 : 데이터베이스, 기타 자바 기능을 관리

                        출력은 JSP로 출력을 한다 => EL, JSTL

 => EL (<% %>는 모든 내용이 사라진다) => <%@ %> ==> 선언문

        => ${}

        => ${자바의 일반변수(X)}

        => ${requestScope.변수} => 1) request 2) application 3) session

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String name="홍길동";
	String sex="남자";
	
	request.setAttribute("name", name); //request에 새로운 데이터 추가하는 방식
	request.setAttribute("sex", sex);
	
	String name1="심청이";
	String sex1="여자";
	session.setAttribute("name1", name1);
	session.setAttribute("sex1", sex1);
	
	String name2="박문수";
	String sex2="남자";
	application.setAttribute("name2", name2);
	application.setAttribute("sex2", sex2);
	
	/*
		request.setAttribute("name", name);
							========
		${name}
	    ${requestScope.name}
	     ============== 생략이 가능
	    ${키이름}
	    
	    session.setAttribute("name1", name1);
	     					  =======
	    ${name1}
	    ${sessionScope.name1}
	    ${키이름}
	    
	    application.setAttribute("name1", name2);
	    						=========
	    ${name1}
	    ${applicationScope.name1}
	     
		적용 순서
		request => session => application
		한페이지에 저장 => request
        모든 JSP에서 사용 : session, application
        
	예)
		request.setAttribute("id", "admin1");
		session.setAttribute("id", "admin2");
		application.setAttribute("id", "admin3");
		
		${id} ==> admin1
		
		session.setAttribute("id", "admin2");
		application.setAttribute("id", "admin3");
		
		${id} ==> admin2
				
		application.setAttribute("id", "admin3");
		
		${id} ==> admin3
				
		같은 키가 있는 경우 : request => session => application
				${requestScope.키명}
				${sessionScope.키명}
				${applicationScope.키명}
	*/
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 데이터 출력 -->
	<b>이름:<%=name %></b><br>
	<b>성별:<% out.println(sex); %></b><br>
	<h1>request에 있는 데이터 출력(MVC => 자바에서 HTML로 데이터 전송시에 request 이용)</h1>
	이름:${name }<br><%-- 키 이름, requestScope가 생략 --%>
	<%-- 자바 변경 --%>
	<%--
		가급적이면 => <% %> ==> 사용하지 말라 ==> 태그형의 프로그램으로 전환
	 --%>
	이름(자바):<%= request.getAttribute("name") %><br>
	이름:${requestScope.name}<br>
	성별:${sex }<br>
	<h1>session에 있는 데이터 출력</h1>
	이름:${sessionScope.name }<br> <%-- sessionScope생략하면 request값 --%>
	성별:${sessionScope.sex }<br>
	이름:${name1 }<br>
	성별:${sex1 }<br>
	<h1>application에 있는 데이터 출력</h1>
	이름:${applicationScope.name }<br>
	성별:${applicationScope.sex }<br>
	이름:${name2 }<br>
	성별:${sex2 }<br>
</body>
</html>

 

JSTL 1.2.jar

mvnrepository.com/artifact/javax.servlet/jstl/1.2

 

Standard 1.1.2 jar

mvnrepository.com/artifact/taglibs/standard/1.1.2

 

2. JSTL (Java Standard Tag Library)

자바의 문법을 태그형으로 제공

= 화면 출력 (JSP => 태그를 이용해서 화면에 출력 : View)

  - core : 변수설정, 제어문, URL, 파일 이동

  - format : 문자변환, 날짜변환, 숫자변환

  - fn : 문자열함수, 컬렉션함수를 제어

 

= 사용빈도가 없다(자바 사용 권장)

xml : XML파싱 ====> ~Manager

sql : 오라클 연결 ===> ~DAO

 

<c:set>

<c:forEach>

<c:if> =========> <c:else>가 없다

<c:choose>

<c:redirect>

=> 기타 (spring : spEl)

 

<%--
	core :
		1. 변수 선언
			<c:set var="id" value="admin">
			==> request.setAttribute("id","admin")
									===== ======
								  var(키명) value
		2. 제어문
			<c:if test="조건문">
			<c:forEach var="i" begin="1" end="10" step="1">
				  ======== ========= ======== ========
				   변수명      초기값 	   조건		증가식
				   					  10 (포함)	 증가는 가능, 감소는 불가능
				   					  			 step="1"은 생략이 가능
			<c:forEach var="i" begin="1" end="10">
			==> for(int i=1; i<=10; i++)
			
			List<MovieVO> list=new ArrayList<MovieVO>();
			for(MovieVO vo:list) => foreach방식의 반복문
			// 데이터를 묶어서 사용 (배열, ArrayList)
			<c:forEach var="vo" items="list">
								items ==> 배열, 컬렉션
			String color="red, green, blue, black, yellow";
			StringTokenizer st=new StringTokenizer(color, ",")
			==> String[] colors=color.split(",")
			while(st.hasMoreTokens()){
				System.out.println(st.nextToken())
			}
			<c:forTokens var="s" value="red,green,blue,black,yellow"
						========		============================
						st.nextToken()		자를 문자열
				delims=",">
				==========
				구분문자
			
			switch문장, 다중if
			<c:choose>
				<c:when test=="조건">처리문장</c:when>
				<c:when test=="조건">처리문장</c:when>
				<c:when test=="조건">처리문장</c:when>
				<c:otherwise>디폴트(조건이 없는 경우)</c:otherwise>
			</c:choose>
			
		3. 파일이동
			<c:redirect url="이동할 주소"> response.sendRedirect("");
			<c:import>
			
 --%>

 

'<%'로 시작하는 모든 내용을 사용하지 않는다 (권장) ==> 태그형 프로그램으로 전환

===========

MVC (model2)

Model : 자바 (VO, DAO, Manager...)

View : JSP (태그형 프로그램)

Controller : Model과 View연결해주는 역할 (서블릿)

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" %>
<%-- 라이브러리 추가 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 변수 선언 : JSTL(XML로 제작 => 여는 태그, 닫는 태그, 속성값이 있는 경우에는 "") --%>
<%
	String name="홍길동"; // 일반 출력
	request.setAttribute("name", name);
%>
<c:set var="id" value="admin"/>
<%--
	<c:set var="id" value="admin"/>
	request.setAttribute("id","admin");
 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 이름 : <%= name %>, <% out.println(name); %><br>
 EL : ${name }
 <br>
 EL : ${id }
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%-- tag라이브러리 첨부 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Java로 반복문 사용</h1>
	<%
		for(int i=1; i<=10; i++){
	%>
		<%=i %>&nbsp;
	<%
		}
	%>
	<br>
	<h1>JSTL로 반복문 사용</h1>
	<%-- step="1"일때는 생략이 가능 --%>
	<c:forEach var="i" begin="1" end="10" step="1">
		${i }&nbsp;
	</c:forEach>
	<br>
	<h1>Java로 단어별 출력(StringTokenizer)</h1>
	<%
		String color="red, blue, yellow, green, white";
		StringTokenizer st=new StringTokenizer(color,",");
		while(st.hasMoreTokens()){
	%>
		<%=st.nextToken() %><br>
	<%
		}
	%>
	<br>
	<h1>JSTL로 단어별 출력</h1>
	<%-- 변수 선언 --%>
	<c:set var="color" value="red,blue,yellow,green,white"/>
	<%--
			request.setAttribute("color","red,blue,yellow,green,white");
			=> request.getAttribute("color");
			=> 자체 출력 : ${color{
	 --%>
	<c:forTokens var="s" items="${color }" delims=",">
		${s }<br>
	</c:forTokens>
	<h1>JSTL => Java 변경</h1>
	<%
		// <c:set var="color" value="red,blue,yellow,green,white"/>
		request.setAttribute("color", "red,blue,yellow,green,white");
		String color1=(String)request.getAttribute("color");
		StringTokenizer st1=new StringTokenizer(color1, ",");
		while(st.hasMoreTokens()){
	%>
		<%=st1.nextToken() %><br>
	<%
		}
	%>
	<h1>Java로 forEach구문</h1>
	<%
		List<String> names=new ArrayList<String>();
		names.add("심청이");
		names.add("홍길동");
		names.add("박문수");
		names.add("이순신");
		names.add("춘향이");
		
		// for-each (향상된 for => 웹에서는 주로 사용)
		for(String name:names){
	%>
			<%=name %>&nbsp;
	<%
		}
	%>
	<h1>JSTL를 이용한 for-each</h1>
	<c:set var="names" value="<%=names %>"/>
	<c:forEach var="name" items="${names }">
		${name }&nbsp;
	</c:forEach>
</body>
</html>

 

구구단 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h1>Java로 구구단 출력</h1>
		<table border=1 bordercolor=black width=560>
			<tr bgcolor=#ccffcc>
				<%
					for(int i=2; i<=9; i++){
				%>
					<th><%=i+"단" %></th>
				<%
					}
				%>
			</tr>
			<%
				for(int i=1; i<=9; i++){
			%>
				<tr>
			<%
				for(int j=2; j<=9; j++){
			%>
					<td><%=j+"*"+i+"="+j*i %></td>
			<%
				}
			%>
				</tr>
			<%
			}
			%>
		</table>
		<br>
		<h1>JSTL/EL을 이용한 구구단</h1>
		<table border=1 bordercolor=black>
			<tr>
				<c:forEach var="i" begin="2" end="9">
					<th>${i }단</th>
					<%--
						${i}
						${10} ${10+"단"} => 오류 (+: 산술, 문자열 결합)
						${10+="단"} + (산술) , += (문자열 결합)
						EL ==> Java만 사용하는 것이 아니다
					 --%>
				</c:forEach>
			</tr>
			<c:forEach var="i" begin="1" end="9">
				<tr>
					<c:forEach var="j" begin="2" end="9">
						<td>${j}*${i}=${i*j }</td>
					</c:forEach>
				</tr>
			</c:forEach>
		</table>
	</center>
</body>
</html>

 

EmpVO.java

package com.sist.dao;
import java.util.*;
public class EmpVO {
    private int empno;
    private String ename;
    private String job;
    private Date hiredate;
    private String dbday;
    private int sal;
    private String dname;
    private String loc;
	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 Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public String getDbday() {
		return dbday;
	}
	public void setDbday(String dbday) {
		this.dbday = dbday;
	}
	public int getSal() {
		return sal;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	   
}

EmpDAO.java

package com.sist.dao;
import java.sql.*;
import java.util.*;
public class EmpDAO {
   private Connection conn;
   private PreparedStatement ps;
   private final String URL="jdbc:oracle:thin:@211.238.142.000:1521:XE";
   // 드라이버 등록
   public EmpDAO()
   {
	   try
	   {
		   Class.forName("oracle.jdbc.driver.OracleDriver");// 대소문자 구분 
	   }catch(Exception ex)
	   {
		   System.out.println(ex.getMessage());
	   }
   }
   // 오라클 연결
   public void getConnection()
   {
	   try
	   {
		   conn=DriverManager.getConnection(URL,"hr","happy");
	   }catch(Exception ex) {}
   }
   // 오라클 연결 해제
   public void disConnection()
   {
	   try
	   {
		   if(ps!=null)
			   ps.close();
		   if(conn!=null)
			   conn.close();
	   }catch(Exception ex) {}
   }
   // Mybatis => Config.xml => Connection
   // 데이터 처리 => emp-mapper.xml에 존재 (SQL) => PreparedStatement
   /*
    *   Mybatis 
    *   ======= XML,Annotation
    */
   /*
    *     저장 방법 
    *     List (interface) => 자신이 생성이 불가능 => 인터페이스를 구현하고 있는 클래스를 이용해서 메모리 할당    
    *     ====          
    *      |  
    *    ArrayList(비동기 => 데이터베이스 연결시)   List<EmpVO> list=new ArrayList<EmpVO>();
    *    Vector(동기화 => 네트워크 사용자 정보)     List<EmpVO> list=new Vector<EmpVO>();
    *    LinkedList(C 언어와 호환)             List<EmpVO> list=new LinkedList<EmpVO>();
    *    => 순서가 존재 
    *    => 중복된 데이터를 저장 
    *    
    *    Set (interface)
    *    ===
    *     |
    *    TreeSet
    *    HashSet
    *    => 순서가 없다
    *    => 중복된 데이터를 사용할 수 없다 (사용빈도가 낮다)
    *    
    *    Map (interface)
    *    ===
    *     |
    *    HashMap => Hashtable의 단점을 보완 
    *    Hashtable 
    *    => 키와 값을 나눠서 저장 
    *    => 키는 중복이 없고 값은 중복이 가능 
    *    => 클래스를 미리 메모리할당을 하고 키를 이용해서 할당된 주소를 찾아서 사용 (Spring)
    *    => 웹에서 사용되는 request,response,session,cookie ==> Map방식을 이용 (키,값)
    *    
    *    ===============> Collection Framework : 데이터를 모아서 처리하기 쉽게 제공 (자료구조)
    *                     = 라이브러리 => 표준화
    */
   public List<EmpVO> empListData()
   {
	   List<EmpVO> list=new ArrayList<EmpVO>();// 순서가 필요 , 데이터를 중복 
	   // 예외처리 => 비정상 종료를 방지하는 프로그램 (에러 발생시 => 회피,점프)
	   try
	   {
		   // 정상수행문장 
		   // 연결
		   getConnection();
		   // SQL문장 전송 
		   String sql="SELECT empno,ename,job,TO_CHAR(hiredate,'YYYY-MM-DD'),sal,dname,loc "
				     +"FROM emp,dept "
				     +"WHERE emp.deptno=dept.deptno";
		   ps=conn.prepareStatement(sql);
		   // 실행후에 결과값 읽기
		   ResultSet rs=ps.executeQuery();
		   while(rs.next())
		   {
			   EmpVO vo=new EmpVO();
			   vo.setEmpno(rs.getInt(1));
			   vo.setEname(rs.getString(2));
			   vo.setJob(rs.getString(3));
			   vo.setDbday(rs.getString(4));
			   vo.setSal(rs.getInt(5));
			   vo.setDname(rs.getString(6));
			   vo.setLoc(rs.getString(7));
			   
			   // 전체 => list에 첨부
			   list.add(vo);
		   }
		   rs.close();
	   }catch(Exception ex)
	   {
		   //에러발생시 => 복구 
		   System.out.println(ex.getMessage());//에러 확인 => 프로그램을 수정할 목적 
	   }
	   finally
	   {
		   // 서버,데이터베이스 닫는 경우에 사용(무조건 수행문장)
		   disConnection();
	   }
	   return list;
   }
}

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,com.sist.dao.*"%>
<%-- JSTL 사용 (제어문) --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%--
       EmpDAO를 통해서 데이터를 가지고 온다 
 --%>
<%
     EmpDAO dao=new EmpDAO();
     List<EmpVO> list=dao.empListData(); // Controller:데이터를 가지고 와서 => request에 값을 담아서 JSP전송
%>
<%-- request에 값을 추가 : EL을 이용할 수 있다 
     request.setAttribute("list",list)
--%>
<c:set var="list" value="<%=list %>"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <center>
      <h1>사용 목록</h1>
      <table border=1 bordercolor=black width=700>
        <tr bgcolor=#ccccff>
          <th>사번</th>
          <th>이름</th>
          <th>직위</th>
          <th>입사일</th>
          <th>부서</th>
          <th>근무지</th>
          <th>급여</th>
        </tr>
        <%-- <%
           for(EmpVO vo:list)
           {
        %>
              <tr>
                <td><%=vo.getEmpno() %></td>
                <td><%=vo.getEname() %></td>
                <td><%=vo.getJob() %></td>
                <td><%=vo.getDbday() %></td>
                <td><%=vo.getDname() %></td>
                <td><%=vo.getLoc() %></td>
                <td><%=vo.getSal() %></td>
              </tr>
        <% 
           }
        %> --%>
        <c:forEach var="vo" items="${list }">
        <%-- var="vo" vo객체 생성 items="실제 데이터를 가지고 온다"--%>
          <tr>
            <%-- <td>${vo.getEmpno() }</td>
            <td>${vo.getEname() }</td>
            <td>${vo.getJob() }</td>
            <td>${vo.getDbday() }</td>
            <td>${vo.getDname() }</td>
            <td>${vo.getLoc() }</td>
            <td>${vo.getSal() }</td> --%>
            <%-- 일반적으로 사용하는 방식 --%>
            <td>${vo.empno }</td><%-- vo.getEmpno() : getXxx()가 없는 경우에는 오류--%>
            <%-- VO제작시에는 반드시 getter/setter를 만든다  --%>
            <td>${vo.ename }</td>
            <td>${vo.job }</td>
            <td>${vo.dbday }</td>
            <td>${vo.dname }</td>
            <td>${vo.loc }</td>
            <td>${vo.sal }</td>
          </tr>
        </c:forEach>
      </table>
   </center>
</body>
</html>

 

 

3. EL => 표현언어(브라우저 출력) : p254

1) 방식

= ${requestScope.id} ==> request.getAttribute("id") => 한개의 JSP에서 사용

한번 사용하고 버리는 경우 => request.setAttribute()

= ${sessionScope.id} ==> session.getAttribute("id") => 프로젝트에 있는 모든 JSP에 사용

여러개의 JSP에서 공통으로 사용되는 데이터가 있는 경우 session.setAttribute()

= ${application.id} ==> application.getAttribute("id")

= ${param.id} ==> request.getParameter("id");

 

2) EL에서 사용하는 연산자 => 제어문 (조건문 사용시) : p258

= 산술연산자

  + : 순수하게 숫자만 계산한다 (문자열 결합은 없다)

       ${10+10} ==> 20

       ${10+"10"} ==> 20

                ==== 숫자형으로 문자열이 있는 경우 자동으로 Integer.parseInt("10");

       ${null+10} ==> 10

                === null값인 경우에는 0으로 취급

       ${10+"10 "} ==> 오류

         *** ${10+="10"} 1010 => += 문자열 결합

  - : 순수하게 숫자만 계산

       ${10-10} ==> 0

       ${10-"10"} ==> 0

       ${null-10} ==> -10 (산술연산자에서는 null은 0값으로 처리)

  *

=================================================================

  / : 0으로 나눌 수 없다, 정수/정수 = 실수 (5/2=2) (5/2=2.5)

       ${5/2}, ${5 div 2} / 대신 div를 사용할 수 있다

  % : 나머지 mod

       ${5%2} => 1 , ${5 mod 2} => 1 

 

<body>
	<h1>EL연산자 사용 +,-,*</h1>
	5+5=${5+5 }<br>
	5+"5"=${5+"5" }<br>문자열 결합을 하지 않고 정수형으로 변환후에 연산처리
	null+5=${null+5 }<br>null 일때는 0으로 인식
	<h1>EL연산자 사용 / %</h1>
	5/2=${5/2 }<br>정수/정수 = 실수
	5 div 2=${5 div 2 }<br>
	5%2=${5%2 }<br>
	5 mod 2=${5 mod 2 }
</body>

= 비교연산자 : 결과값 (true/false) => 조건문

    == : 문자열도 ==으로 비교한다 ${id=='admin'}

           ${id eq 'admin'}

                 == equals

    != : 문자열도 !=으로 비교한다 ${id!='admin'}

           ${id ne 'admin'}

                 == not equals

    < : ${ 7<8 } ==> ${7 lt 8}

    > : ${ 7>8 } ==> ${7 gt 8}

    <= : ${ 7<=8 } ==> ${7 le 8}

    >= : ${ 7>=8 } ==> ${7 ge 8}

 

= 논리연산자

     && ==> and

     || ==> or

     ! ==> not

= Empty

= 삼항연산자

= 부정연산자

<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%-- taglib를 가지고 온다 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
     Date date=new Date();
     SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
     String today=sdf.format(date);
%>
<%-- 오늘 날짜 저장 --%>
<c:set var="today" value="<%=today %>"/>
<%-- today=2020-10-05 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

   <h1>1~10까지 출력 (짝수만 출력)</h1>
   <%-- 형식:XML => 여는 태그와 닫는 태그가 명확 --%>
   <c:forEach var="i" begin="1" end="10"><%-- for(int i=1;i<=10;i++) --%>
     <%--
          == (eq)
          != (ne)
      --%>
     <c:if test="${i%2 ne 0 }">
       ${i }&nbsp; <%-- &nbsp; 공백 --%>
     </c:if>
   </c:forEach>
   
   <br>
   <h1>EL에서 문자열 비교</h1>
   <%-- test=>조건을 저장하는 속성
        XML은 없는 속성을 사용하면 error가 발생
        if(조건문)
        
        <c:if test="">
    --%>
   <%--
        <c:else>가 존재하지 않는다 
    --%>
   <%-- <c:if test="${today=='2020-10-05' }">
     <font color="red"><b>오늘 날짜입니다</b></font>
   </c:if>
   <c:if test="${today!='2020-10-04' }">
     <font color="red"><b>오늘 날짜가 아닙니다</b></font>
   </c:if> --%>
   <c:choose><!--  다중 if , 선택 if -->
     <%-- c:when : if 
          '' => 문자열 
          ===========
            = 자바스크립트
            = 오라클
     --%>
     <c:when test="${today eq '2020-10-05' }">
       <font color="red"><b>오늘 날짜입니다</b></font>
     </c:when>
     <%-- c:otherwise else --%>
     <c:otherwise>
       <font color="red"><b>오늘 날짜가 아닙니다</b></font>
     </c:otherwise>
   </c:choose>
</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%--
     core : 변수설정 , 제어문 , 화면이동
     fmt : format => 날짜 변환  ==> 오라클  => TO_CHAR
 --%>
<%
     String id="admin";
     String admin="n";
     // and(&&) , or(||) , not(!) 
%>
<%-- 변수 설정 --%>
<c:set var="id" value="<%=id %>"/>
<%--
      request.setAttribute("id","admin"); 
      => request.getAttribute("id")
      <%= request.getAttribute("id") %> ==> ${id}
 --%>
<c:set var="admin" value="<%=admin %>"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%--
      ==  eq
      !=  ne
      <   lt
      >   gt
      <=  le
      >=  ge
      
      && and
      || or
      ! not
      
      / div
      % mod
 --%>
<body>
   <h1>EL연산자 논리 연산자(&&,||,!)</h1>
   <%--
        문자열 비교 ==> ==
        문자열 표현  ==> ''
    --%>
   <c:if test="${ id == 'admin'  and  admin eq 'y'}">
     <b>관리자입니다</b>
   </c:if>
   <c:if test="${ not (id eq 'admin'  and  admin eq 'y')}">
     <b>일반유저입니다</b>
   </c:if>
   <br>
   <c:set var="sex" value="1"/>
   <!--  삼항연산자 
         조건 ?  값1 : 값2
     ==== true => 값1
          false=> 값2   ==> if~else
   -->
   ${sex==1?"남자":"여자" }<br>
   <c:set var="msg1" value="Hello"/>
   <c:set var="msg2" value=" JSP(JSTL,EL)"/>
   ${msg1 += msg2 } <%-- 문자열 결합 연산자 --%>
</body>
</html>

 

 

===================================================================

src

Config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <properties resource="db.properties"/>
  <typeAliases>
      <typeAlias type="com.sist.dao.BoardVO" alias="BoardVO"/>
  </typeAliases>
  <environments default="development">
    <environment id="development">
       <transactionManager type="JDBC"/>
       <dataSource type="POOLED">
           <property name="driver" value="${driver}"/>
           <property name="url" value="${url}"/>
           <property name="username" value="${username}"/>
           <property name="password" value="${password}"/>
       </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/sist/dao/board-mapper.xml"/>
  </mappers>
</configuration>

db.properties

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@211.238.142.000:1521:XE
username=hr
password=happy

 

com.sist.dao

BoardVO.java

package com.sist.dao;
/*
 *   NO      NOT NULL NUMBER         
	 NAME    NOT NULL VARCHAR2(34)   
	 EMAIL            VARCHAR2(200)  
	 SUBJECT NOT NULL VARCHAR2(4000) 
	 CONTENT NOT NULL CLOB           
	 PWD     NOT NULL VARCHAR2(10)   
	 REGDATE          DATE           
	 HIT              NUMBER 
 */
import java.util.*;
public class BoardVO {
    private int no;
    private String name;
    private String email;
    private String subject;
    private String content;
    private String pwd;
    private Date regdate;
    private int hit;
    
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	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 String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public Date getRegdate() {
		return regdate;
	}
	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}
	public int getHit() {
		return hit;
	}
	public void setHit(int hit) {
		this.hit = hit;
	}
	  
}

BoardDAO.java

package com.sist.dao;
import java.io.*;
import java.util.*;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class BoardDAO {
   // XML파일 읽기
   private static SqlSessionFactory ssf;
   // 자동 초기화 => 블록
   static 
   {
	   try
	   {
		   // 파일 읽기
		   Reader reader=Resources.getResourceAsReader("Config.xml");
		   // XML 파싱 => 필요한 데이터를 저장한다 
		   ssf=new SqlSessionFactoryBuilder().build(reader);
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
   }
   // 목록 읽기 
   // <select id="boardListData" resultType="BoardVO" parameterType="hashmap">
   public static List<BoardVO> boardListData(Map map)
   {
	   List<BoardVO> list=new ArrayList<BoardVO>();//list=> 값을 채운다
	   // Connection => Sqlession
	   SqlSession session=null;
	   try
	   {
		   // 연결 객체 
		   session=ssf.openSession();
		   // SQL문장 실행 요청
		   list=session.selectList("boardListData",map);
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
	   finally
	   {
		   if(session!=null)
			   session.close();
	   }
	   return list;
   }
   /*
    *     <update id="hitIncrement" parameterType="int">
		    UPDATE freeboard SET
		    hit=hit+1
		    WHERE no=#{no}
		  </update>
		  <select id="boardDetailData" resultType="BoardVO" parameterType="int">
		    SELECT no,name,subject,content,regdate,hit 
		    FROM freeboard
		    WHERE no=#{no}
		  </select>
    */
   //          resultType              parameterType
   public static BoardVO boardDetailData(int no)
   {
	   /*
	    *   resultType => 리턴형    ==> 
	    *   List<BoardVO> ==========> selectList
	    *   BoardVO       ==========> selectOne
	    *   parameterType => 매개변수
	    *   => 고급 : subquery , PL/SQL , Index
	    *   => MVC 
	    *   => JavaScript (Ajax)
	    */
	   BoardVO vo=new BoardVO();
	   // Connection => SqlSession
	   /*
	    *   자바 (JDBC) => autoCommit
	    *   UPDATE,DELETE,INSERT ==> commit
	    *   =====================
	    *   
	    *   session=ssf.openSession(true) => INSERT,UPDATE,DELETE
	    *   
	    *   session=ssf.openSession(); => UPDATE,SELECT
	    *   문장수행
	    *   session.commit()
	    */
	   SqlSession session=null;
	   try
	   {
		   // 연결 시도
		   session=ssf.openSession();
		   // 조회수 증가 
		   session.update("hitIncrement", no);
		   session.commit();
		   
		   // 실제 데이터 
		   vo=session.selectOne("boardDetailData", no);
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
	   finally
	   {
		   // Connection 사용후에 반환  ==> DBCP
		   /*
		    *    JDBC 
		    *    1. 요청하면 연결 , 처리후에 해제 => UNPOOLED => 연결시간을 많이 소모한다
		    *                                            =================
		    *    DBCP 
		    *    1. 미리 오라클연결 => 객체 (POOL에 저장) => 처리가 끝나면 반드시 POOL안에 반환(재사용)
		    *    2. Connection을 제어  ==> POOLED
		    */
		   if(session!=null)
			    session.close();
	   }
	   return vo;
   }
   // 총페이지 구하기 
   /*
    *     <select id="boardTotalPage" resultType="int">
		    SELECT CEIL(COUNT(*)/10.0) FROM freeboard
		  </select>
    */
   public static int boardTotalPage()
   {
	   int total=0;
	   SqlSession session=null;
	   try
	   {
		   // 연결
		   session=ssf.openSession();
		   // 데이터 읽어 오기 
		   total=session.selectOne("boardTotalPage");// 대소문자 구분 
	   }catch(Exception ex)
	   {
		   // 에러 처리
		   ex.printStackTrace();
	   }
	   finally
	   {
		   // 반환 => 재사용
		   if(session!=null)
			   session.close();
	   }
	   
	   return total;
   }
   // 데이터 추가
   /*
    *   <insert id="boardInsert" parameterType="BoardVO">
		   INSERT INTO freeboard(no,name,email,subject,content,pwd)
		   VALUES(
		     (SELECT NVL(MAX(no)+1,1) FROM freeboard),
		     #{name},
		     ' ',
		     #{subject},
		     #{content},
		     #{pwd}
		   )
		  </insert>
    */
   public static void boardInsert(BoardVO vo)
   {
	   SqlSession session=null;
	   try
	   {
		   session=ssf.openSession(true);
		   session.insert("boardInsert",vo);
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
	   finally
	   {
		   if(session!=null)
			   session.close();
	   }
   }
   // 수정할 데이터 읽기 
   public static BoardVO boardUpdateData(int no)
   {
	   BoardVO vo=new BoardVO();
	   SqlSession session=null;
	   try
	   {
		   // 연결
		   session=ssf.openSession();
		   vo=session.selectOne("boardDetailData", no);
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();// 에러 
	   }
	   finally
	   {
		   // 반환 
		   if(session!=null)
			   session.close();
	   }
	   return vo;
   }
   //수정 
   /*
    *   <select id="boardGetPassword" resultType="string" parameterType="int">
		    SELECT pwd FROM freeboard
		    WHERE no=#{no}
		  </select>
		  <update id="boardupdate" parameterType="BoardVO">
		    UPDATE freeboard SET
		    name=#{name},
		    subject=#{subject},
		    content=#{content}
		    WHERE no=#{no}
		  </update>
    */
   public static boolean boardUpdate(BoardVO vo)
   {
	   boolean bCheck=false;
	   SqlSession session=null;
	   try
	   {
		   // 연결
		   session=ssf.openSession();
		   // 비밀번호 검색 
		   String db_pwd=session.selectOne("boardGetPassword", vo.getNo());
		   if(db_pwd.equals(vo.getPwd()))// 본인여부 확인 => 수정
		   {
			   bCheck=true;
			   // 실제 수정을 한다 
			   session.update("boardupdate", vo);
			   session.commit();
		   }
		   else
		   {
			   bCheck=false;
		   }
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
	   finally
	   {
		   if(session!=null)
			   session.close();
	   }
	   return bCheck;
   }
   
   // 삭제하기 
   /*
    *     <delete id="boardDelete" parameterType="int">
		    DELETE FROM freeboard
		    WHERE no=#{no}
		  </delete>
    */
   public static boolean boardDelete(int no,String pwd)
   {
	   boolean bCheck=false;
	   SqlSession session=null;
	   try
	   {
		   // 연결 
		   session=ssf.openSession();
		   // 비밀번호 검사
		   String db_pwd=session.selectOne("boardGetPassword", no);
		   if(db_pwd.equals(pwd))// 삭제
		   {
			   bCheck=true;
			   // 실제 데이터 삭제
			   session.delete("boardDelete",no);
			   session.commit();
		   }
		   else // 비밀번호가 틀리다
		   {
			   bCheck=false;
		   }
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
	   finally
	   {
		   if(session!=null)
			   session.close();
	   }
	   return bCheck;
   }
}

board-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sist.dao.board-mapper">
  <!-- SQL문장 전송 : SQL문장을 저장  -->
  <select id="boardListData" resultType="BoardVO" parameterType="hashmap">
    SELECT no,subject,name,regdate,TO_CHAR(regdate,'YYYY-MM-DD') as dbday,hit,num 
    FROM (SELECT no,subject,name,regdate,hit,rownum as num 
    FROM (SELECT no,subject,name,regdate,hit 
    FROM freeboard ORDER BY no DESC))
    WHERE num BETWEEN #{start} AND #{end}
  </select>
  <!-- 총페이지 구하기 -->
  <select id="boardTotalPage" resultType="int">
    SELECT CEIL(COUNT(*)/10.0) FROM freeboard
  </select>
  <!-- 
       JSP => 링크(요청) 
       list.jsp   =====> BoardManager  <=====> DAO
                                       SQL ==> DAO
                                    =======   ====== BoardDAO  ==> detail.jsp
                                    board-mapper.xml
   -->
  <!-- 상세보기 SQL문장을 받아서 처리 => DAO-->
  <update id="hitIncrement" parameterType="int">
    UPDATE freeboard SET
    hit=hit+1
    WHERE no=#{no}
  </update>
  <select id="boardDetailData" resultType="BoardVO" parameterType="int">
    SELECT no,name,subject,content,regdate,hit 
    FROM freeboard
    WHERE no=#{no}
  </select>
  
  <!-- 데이터 추가 -->
  <insert id="boardInsert" parameterType="BoardVO">
   INSERT INTO freeboard(no,name,email,subject,content,pwd)
   VALUES(
     (SELECT NVL(MAX(no)+1,1) FROM freeboard),
     #{name},
     '',
     #{subject},
     #{content},
     #{pwd}
   )
  </insert>
  <!-- 수정하기 -->
  <!-- 
         resultType ==> String , string (대소문자 구분이 없다)
   -->
  <select id="boardGetPassword" resultType="string" parameterType="int">
    SELECT pwd FROM freeboard
    WHERE no=#{no}
  </select>
  <update id="boardupdate" parameterType="BoardVO">
    UPDATE freeboard SET
    name=#{name},
    subject=#{subject},
    content=#{content}
    WHERE no=#{no}
  </update>
  
  <!-- 삭제하기  -->
  <delete id="boardDelete" parameterType="int">
    DELETE FROM freeboard
    WHERE no=#{no}
  </delete>
</mapper>

 

com.sist.manager

BoardManager.java

package com.sist.manager;
import java.text.SimpleDateFormat;
import java.util.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sist.dao.*;
public class BoardManager {
   public void boardListData(HttpServletRequest request)
   {
	   // page를 받는다 
	   String page=request.getParameter("page");
	   if(page==null)
		   page="1"; //JSP에서 page가 존재(객체)
	   int curpage=Integer.parseInt(page);
	   // 페이지 나누기 
	   int rowSize=10;
	   int start=(curpage*rowSize)-(rowSize-1);
	   int end=curpage*rowSize;
	   /*
	    *     <select id="boardListData" resultType="BoardVO" parameterType="hashmap">
			    SELECT no,subject,name,regdate,hit,num 
			    FROM (SELECT no,subject,name,regdate,hit,rownum as num 
			    FROM (SELECT no,subject,name,regdate,hit 
			    FROM freeboard ORDER BY no DESC))
			    WHERE num BETWEEN #{start} AND #{end}
			  </select>
	    */
	   // 결과값 읽기
	   Map map=new HashMap();
	   map.put("start", start);
	   map.put("end",end);
	   List<BoardVO> list=BoardDAO.boardListData(map);
	   request.setAttribute("list", list);//JSP에서 request를 받아서 JSTL,EL
	   // M(Model) => 자바 (기능(요청) 처리) , V(View) => JSP(HTML) => 출력만 한다 
	   // 자바 <==> JSP(HTML)   => MV구조 ==> MVC // 자바와 HTML분리 (데이터를 받을 경우 => request,session)
	   // 데이터 공유 => session에 저장 
	   // 한개의 JSP에서만 사용 => request에 저장 
	   // Front-End (React=>Redux, Vue => Vuex) => Flux
	   Date date=new Date();
	   SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
	   String today=sdf.format(date);
	   request.setAttribute("today", today);
	   /*
	    *   request.setAttribute() => JSP출력할 내용을 request에 담아서 전송 
	    *   => 1번만 사용하는 것이 아니라 => 필요한 모든 데이터를 담을 수 있다 
	    */
	   int totalpage=BoardDAO.boardTotalPage();
	   
	   request.setAttribute("curpage", curpage);
	   request.setAttribute("totalpage", totalpage);
   }
   // JSP에서 보낸 사용자 요청정보를 받아서 처리 => 결과값을 (request에 첨부해서 전송)
   public void boardDetailData(HttpServletRequest request)
   {
	   // request => JSP에서 전송
	   // 요청한 게시물을 찾는다  ==> no값
	   // detail.jsp?no=10
	   String no=request.getParameter("no");
	   // 데이터 읽기 시작  (데이터베이스)
	   BoardVO vo=BoardDAO.boardDetailData(Integer.parseInt(no));
	   // 결과값을 request에 담아서 => JSP로 전송 
	   request.setAttribute("vo", vo);
	   
   }
   // 게시물 추가 
   public void boardInsert(HttpServletRequest request,HttpServletResponse response)
   {
	   try
	   {
		   // 한글 처리 
		   request.setCharacterEncoding("UTF-8");
		   // 사용자 요청값 받기 
		   String name=request.getParameter("name");
		   String subject=request.getParameter("subject");
		   String content=request.getParameter("content");
		   String pwd=request.getParameter("pwd");
		   
		   BoardVO vo=new BoardVO();
		   vo.setName(name);
		   vo.setSubject(subject);
		   vo.setContent(content);
		   vo.setPwd(pwd);
		   // BoardDAO ==> 처리 (오라클 insert) => insert (SQL)
		   BoardDAO.boardInsert(vo);
		   // 이동 => list.jsp
		   response.sendRedirect("list.jsp");
	   }catch(Exception ex){}
   }
   // 모든 JSP에서 요청한 내용 ==> 처리해주는 장소
   // 객체지향 프로그램 : 재사용 (기능별 분리 ===> 조립)
   // 필수 (사이트) : 게시판 (CURD), 회원 , 공지사항 
   public void boardUpdateData(HttpServletRequest request)
   {
	   // detail.jsp :  update.jsp?no=${vo.no }
	   String no=request.getParameter("no");
	   BoardVO vo=BoardDAO.boardUpdateData(Integer.parseInt(no));
	   // vo ==> update.jsp로 전송 
	   request.setAttribute("vo", vo);
   }
   // 실제 수정하기 
   public void boardUpdate(HttpServletRequest request)
   {
	   try
	   {
		   // 한글 변환 => 컴파일예외처리 
		   request.setCharacterEncoding("UTF-8");
		   // 사용자가 보내준 데이터 받기 
		   String no=request.getParameter("no");
		   String name=request.getParameter("name");
		   String subject=request.getParameter("subject");
		   String content=request.getParameter("content");
		   String pwd=request.getParameter("pwd");
		   // BoardVO에 묶어서 => BoardDAO로 전송 ==> 오라클에서 수정
		   /*
		    *    BoardManager : 사용자 요청을 받아서 처리 
		    *    BoardDAO : 오라클 연결 => 오라클에서 기능 수행이 가능 
		    *    BoardVO : 데이터를 묶어서 전송하는 역할
		    *    ~.jsp : 결과값 출력만 하는 역할 
		    */
		   BoardVO vo=new BoardVO();
		   vo.setName(name);
		   vo.setSubject(subject);
		   vo.setContent(content);
		   vo.setPwd(pwd);
		   vo.setNo(Integer.parseInt(no));
		   // vo=>DAO로 전송 
		   
		   boolean bCheck=BoardDAO.boardUpdate(vo);
		   
		   // 결과값 => update_ok.jsp로 전송 
		   request.setAttribute("bCheck", bCheck);// 처리(X) => javascript를 전송할 수 없다 
		   // request를 통해서 보낼 수 있는 데이터 => Object 
		   // Spring : RestController
		   request.setAttribute("no", vo.getNo());
	   }catch(Exception ex) {}
   }
   
   // 삭제 하기 
   public void boardDelete(HttpServletRequest request)
   {
	   // no,pwd을 받는다 
	   String no=request.getParameter("no");
	   String pwd=request.getParameter("pwd");
	   // no,pwd => BoardDAO 전송 => 데이터베이스 처리  (board-mapper.xml(SQL) ==> BoardDAO에서 읽어서 처리)
	   boolean bCheck=BoardDAO.boardDelete(Integer.parseInt(no), pwd);
	   // BoardDAO에서 결과값을 받아서 
	   // delete_ok.jsp로 전송 ==> 화면이동 
	   request.setAttribute("bCheck", bCheck);// 자바코딩 안에서는 JavaScript를 코딩 할 수 없다 
	   /*
	    *   JavaScript => JSP,Servlet
	    *   
	    *   JSP ==> 데이터 전송 (자바는 받을 수 없다) => 메소드 (request)
	    *   
	    *   JSP <======> Java
	    *       메소드 호출 
	    *   =============================================웹 URL을 이용해서 데이터 전송
	    *   JSP <=======> Servlet
	    *        GET/POST  ==> URL Aaa?no=10
	    */
   }
}

 

WebContent/board/list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.manager.*"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%--
       request.getParameter() : 사용자가 요청한 데이터 
       request.setAttribute() => request.getAttribute()
       ================================================
               사용자가 요청한 데이터 외에 다른 데이터 추가해서 사용 
               
        => id , pwd 로그인 ===> 서버에서는 개인정보 여러개 추가 
                              name , 주소
       
 --%>
<%-- BoardManager => 메모리 할당 --%>
<jsp:useBean id="mgr" class="com.sist.manager.BoardManager"/>
<%-- 데이터 받는다 --%>
<%
     mgr.boardListData(request);// Controller
     // Call By Reference (주소 => 주소에 값을 채워주는 방식)
     // request => 각 JSP마다 가지고 있다 
%>

<%--
                 page                         Map
    list.jsp  ==============> BoardManager  =========> BoardDAO ========> 오라클
                request                    List<BoardVO> 
                
                   request
    JSP(Servlet)  <========> Java
                   request
                   
                                   메소드 호출(매개변수)
    Java          <========> Java
                                     리턴형
 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
  <div class="container">
   <div class="row">
     <h1 class="text-center">자유게시판</h1>
     <table class="table">
       <tr>
         <td>
           <a href="insert.jsp" class="btn btn-sm btn-primary">새글</a>
         </td>
       </tr>
     </table>
     <table class="table table-striped">
       <tr class="danger">
         <th class="text-center" width=10%>번호</th>
         <th class="text-center" width=45%>제목</th>
         <th class="text-center" width=15%>이름</th>
         <th class="text-center" width=20%>작성일</th>
         <th class="text-center" width=10%>조회수</th>
       </tr>
       <c:forEach var="vo" items="${list }">
        <tr>
          <td class="text-center" width=10%>${vo.no }</td>
          <td class="text-left" width=45%>
           <a href="detail.jsp?no=${vo.no }">${vo.subject }</a>
           <c:if test="${today == vo.dbday}">
             <font color=red><sup>new</sup></font>    
           </c:if>
           <%--
                if(request.getAttribute("today").equals(vo.getDbday())
                {
                    <font color=red><sup>new</sup></font>
                }
                
                request.setAttribute() => 반드시 request.getAttribute() => 서버에서 필요한 데이터 첨부
                session , application 
                => 사용자가 전송한 데이터 => request.getParameter()
            --%>
          </td>
          <td class="text-center" width=15%>${vo.name }</td>
          <td class="text-center" width=20%>
           <fmt:formatDate value="${vo.regdate }" pattern="yyyy-MM-dd"/>
           <%--
                  Date date=new Date();
                  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd")
                  out.println(sdf.format(date));
            --%>
          </td>
          <td class="text-center" width=10%>${vo.hit }</td>
        </tr>
       </c:forEach>
      </table>
      <table class="table table-striped">
        <tr>
          <td class="text-right">
            <a href="list.jsp?page=${curpage>1?curpage-1:curpage }" class="btn btn-sm btn-danger">이전</a>
              ${curpage } page / ${totalpage } pages
            <a href="list.jsp?page=${curpage<totalpage?curpage+1:curpage }" class="btn btn-sm btn-primary">다음</a>
          </td>
        </tr>
      </table>
     </div>
    </div>
</body>
</html>

 

3. EL / JSTL

 

1) EL

 (1) Scope => 어디에 저장된 데이터 (p.254)

    = requestScope.키명

    = sessionScope.키명

 

    request.setAttribute("id", "admin");

    => ${requestScope.id} ==> 생략 ${id}

    session.setAttribute("id","admin");

    => ${sessionScope.id}

    => 만약 request에 없는 키명이 있는 경우에는 생략 가능

 

  (2) 연산자

      산술연산자 ( +, -, *, /(div), %(mod))

                      => null + 1 => null은 자동으로 0으로 변경된다

                      => "10"+10 => 20

                      => / => 실수

      비교연산자 (문자열 비교가 가능하다)

                      ==(eq) : 문자열 비교시

                      !=(ne)

                      < (lt)

                      > (gt)

                      <= (le)

                      >= (ge)

      논리연산자

                      && (and)

                      || (or)

                      ! (not)

      문자열 결합

                      +=

      삼항연산자

                      조건 ? 값:값

 

 2) JSTL

       <c:set>

       <c:if>

       <c:forEach>

       <c:choose> <c:when> <c:otherwise>

       <c:redirect>

       <fmt:formatDate>

       <fmt:formatNumber>

 

 

WebContent/board/

detail.jsp 상세보기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.manager.*"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%-- import --%>
<jsp:useBean id="mgr" class="com.sist.manager.BoardManager"/>
<%-- BoardManager mgr=new BoardManager() --%>
<%
     mgr.boardDetailData(request);// 자바에서 detail.jsp가 가지고 있는
     // request에 요청 처리후에 결과값을 담아준다 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<style type="text/css">
.row {
   margin: 0px auto; /*가운데 정렬*/
   width:700px;
}
h1 {
     text-align: center;
}
</style>
</head>
<body>
  <div class="container">
    <div class="row">
      <h1>내용보기</h1>
      <table class="table table-striped">
        <tr>
          <th class="text-center danger" width=20%>번호</th>
          <td class="text-center" width=30%>${vo.no }</td>
          <th class="text-center danger" width=20%>작성일</th>
          <td class="text-center" width=30%>
            <fmt:formatDate value="${vo.regdate }" pattern="yyyy/MM/dd"/>
          </td>
        </tr>
        <tr>
          <th class="text-center danger" width=20%>이름</th>
          <td class="text-center" width=30%>${vo.name }</td>
          <th class="text-center danger" width=20%>조회수</th>
          <td class="text-center" width=30%>${vo.hit }</td>
        </tr>
        <tr>
          <th class="text-center danger" width=20%>제목</th>
          <td class="text-left" colspan="3">${vo.subject }</td>
        </tr>
        <tr>
          <td class="text-left" colspan="4" valign="top" height="200">
            <pre style="white-space: pre-wrap;border: none;background-color: white">${vo.content }</pre>
          </td>
        </tr>
        <tr>
          <td colspan="4" class="text-right">
            <a href="update.jsp?no=${vo.no }" class="btn btn-xs btn-success">수정</a>
            <a href="delete.jsp?no=${vo.no }" class="btn btn-xs btn-info">삭제</a>
            <a href="list.jsp" class="btn btn-xs btn-warning">목록</a>
          </td>
        </tr>
      </table>
    </div>
  </div>
</body>
</html>

 

insert.jsp 글쓰기

<%@ 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>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<style type="text/css">
.row {
   margin: 0px auto; /*가운데 정렬*/
   width:700px;
}
h1 {
     text-align: center;
}
</style>
</head>
<body>
  <div class="row">
   <h1 class="text-center">글쓰기</h1>
   <form method="post" action="insert_ok.jsp">
   <table class="table table-hover">
     <tr>
       <th class="danger text-right" width=15%>이름</th>
       <td width=85%>
         <input type=text name=name size=15 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>제목</th>
       <td width=85%>
         <input type=text name=subject size=45 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>내용</th>
       <td width=85%>
         <textarea rows="10" cols="50" name=content></textarea>
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>비밀번호</th>
       <td width=85%>
         <input type=password name=pwd size=10 class="input-sm">
       </td>
     </tr>
     <tr>
       <td colspan="2" class="text-center">
         <input type=submit value=글쓰기 class="btn btn-sm btn-primary">
         <input type=button value=취소 class="btn btn-sm btn-primary"
           onclick="javascript:history.back()"
         >
       </td>
     </tr>
   </table>
   </form>
  </div>
</body>
</html>

 

insert_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.manager.*"%>
<jsp:useBean id="mgr" class="com.sist.manager.BoardManager"/>
<%
    // BoardManager => request로 전송 => 처리
    mgr.boardInsert(request, response);
%>

 

update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.manager.*"%>
<jsp:useBean id="mgr" class="com.sist.manager.BoardManager"/>
<%
    // DAO로 부터 전에 입력한 데이터 읽기 
    mgr.boardUpdateData(request);//BoardManager가 request에 결과값을 보내준다  
    //vo
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<style type="text/css">
.row {
   margin: 0px auto; /*가운데 정렬*/
   width:700px;
}
h1 {
     text-align: center;
}
</style>
</head>
<body>
  <div class="row">
   <h1 class="text-center">수정하기</h1>
   <%-- 파일 업로드 : 프로토콜 (post)
        enctype="multipart/form-data" => 업로드시만 사용 
               프로토콜
          http : 80
          ftp  : 21
          smtp : 25
          multipart/form-data : 파일을 업로드 
                  범용적으로 사용되는 약속 
    --%>
   <form method="post" action="update_ok.jsp">
   <table class="table table-hover">
     <tr>
       <th class="danger text-right" width=15%>이름</th>
       <td width=85%>
         <input type=text name=name size=15 class="input-sm" value="${vo.name }">
         <input type=hidden name=no value="${vo.no }">
         <!-- 
              ${param.no} => request.getParameter("no")
              String no=${param.no}(X)
              String no=out.println()(X)
              EL==> 출력용으로만 사용 
          -->
         <%--
           detail.jsp ==> 게시물 번호 넘긴다 
           update.jsp에서 저장하고 있다가 ==> update_ok.jsp 
          --%>
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>제목</th>
       <td width=85%>
         <input type=text name=subject size=45 class="input-sm" value="${vo.subject }">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>내용</th>
       <td width=85%>
         <textarea rows="10" cols="50" name=content>${vo.content }</textarea>
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>비밀번호</th>
       <td width=85%>
         <input type=password name=pwd size=10 class="input-sm">
       </td>
     </tr>
     <tr>
       <td colspan="2" class="text-center">
         <input type=submit value=수정 class="btn btn-sm btn-primary">
         <input type=button value=취소 class="btn btn-sm btn-primary"
           onclick="javascript:history.back()"
         >
       </td>
     </tr>
   </table>
   </form>
  </div>
</body>
</html>

 

update_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.manager.*"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%-- BoardManager mgr=new BoardManager() : 태그 --%>
<jsp:useBean id="mgr" class="com.sist.manager.BoardManager"/>
<%
    // BoardManager로 request를 전송하면  => 처리 => 결과값을 jsp로 전송
    // JSP : 요청한 결과값을 출력만 담당 (View) : 프리젠테이션 로직
    // 처리 => Java로 처리 (Model) : 비지니스로직  => Manager,DAO,VO
    // View <===> Model (연결하는 클래스 : Controller) => Spring
    mgr.boardUpdate(request); // request => bCheck
%>
<%--
    <c:if>
    <c:else>(X)
 --%>
<c:choose><%-- switch , 다중 if , 선택 if(if~else) --%>
  <c:when test="${bCheck==true }"><%-- if(조건문) --%>
   <c:redirect url="detail.jsp?no=${no }"/>
   <%-- response.sendRedirect("detail.jsp?no=1") --%>
  </c:when>
  <c:otherwise><%-- default , else --%>
   <script>
   alert("비밀번호가 틀립니다!!");
   history.back();
   </script>
  </c:otherwise>
</c:choose>

 

delete.jsp

<%@ 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>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<style type="text/css">
.row {
   margin: 0px auto; /*가운데 정렬*/
   width:300px;
}
h1 {
     text-align: center;
}
</style>
</head>
<body>
  <div class="container">
    <div class="row">
      <h1 class="text-center">삭제하기</h1>
      <%--
                        no                no,pwd
             detail.jsp ====> delete.jsp  =====> delete_ok.jsp <==> BoardDAO
                                                => HTML,Java => 분리 BoardManager
             
                        no                no,pwd                결과값 (페이지변경)
             detail.jsp ====> delete.jsp  =====> delete_ok.jsp <====> BoardManager
                                                                           ↓↑
                                                                       BoardDAO 
                                                                           ↓↑
                                                                         Oracle
       --%>
      <form method=post action="delete_ok.jsp">
      <table class="table table-striped">
        <tr>
          <td>
                   비밀번호:<input type=password name=pwd size=15 class="input-sm">
                <input type=hidden name=no value="${param.no }">
          </td>
        </tr>
        <tr>
          <td class="text-center">
            <input type=submit value="삭제" class="btn btn-sm btn-danger">
            <input type=button value="취소" class="btn btn-sm btn-warning"
             onclick="javascript:history.back()">
          </td>
        </tr>
      </table>
      </form>
    </div>
  </div>
</body>
</html>

 

delete_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.manager.*"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<jsp:useBean id="mgr" class="com.sist.manager.BoardManager"/>
<%
     // BoardManager => 사용자가 요청한 pwd,no => 전송
     // 결과값을 받아서 화면 이동 
     mgr.boardDelete(request);
%>
<c:choose>
  <c:when test="${bCheck==true }">
   <c:redirect url="list.jsp"/>
  </c:when>
  <c:otherwise>
    <script>
     alert("비밀번호가 틀립니다");
     history.back();// delete.jsp
    </script>
  </c:otherwise>
</c:choose>
반응형

'Back-end > JSP' 카테고리의 다른 글

JSP 6일차 - MVC / 인터페이스  (0) 2020.10.08
JSP 5일차 - JSTL / 망고플레이트  (0) 2020.10.07
JSP 3일차 - include  (0) 2020.09.22
JSP 2일차 - 내장객체(기본객체), error처리  (0) 2020.09.21
JSP 1일차 - 웹사이트 제작  (0) 2020.08.24
Comments