일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Java의정석
- 자스코테
- 정보처리기사실기요약
- 국비코딩
- 이안의평일코딩
- 스프링
- 리액트
- 정보처리기사실기
- 국비IT
- 코딩테스트
- spring
- 오라클
- react
- Oracle
- ReactNative
- 타입스크립트
- VUE
- 평일코딩
- typescript
- 정보처리기사
- CSS
- 정보처리기사요약
- php
- 자바스크립트
- 정보처리기사정리
- 정보처리기사실기정리
- 리액트네이티브
- 자바의정석
- javascript
- 자바스크립트 코딩테스트
- Today
- Total
이안의 평일코딩
JSP 4일차 - Express Language, JSTL / 게시판 본문
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 %>
<%
}
%>
<br>
<h1>JSTL로 반복문 사용</h1>
<%-- step="1"일때는 생략이 가능 --%>
<c:forEach var="i" begin="1" end="10" step="1">
${i }
</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 %>
<%
}
%>
<h1>JSTL를 이용한 for-each</h1>
<c:set var="names" value="<%=names %>"/>
<c:forEach var="name" items="${names }">
${name }
</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 } <%-- 공백 --%>
</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 |