<개념>
웹 페이지나 XML 문서 등의 문서 구조를 표현하고 조작하기 위한 표준 인터페이스
- HTML DOM으로 Javascript에 엑세스해서 HTML문서의 모든 요소를 변경할 수 있다.
- HTML 문서 그 자체의 정보를 모두 가지고 있다.
- HTML 문서를 구성하고 있는 요소들을 node 라고 한다.
- 다른의미로, HTML DOM은 HTML 요소들을 가져와서 수정, 추가 또는 삭제하는 표준 방법
- , , 등의 구성요소를 갖는다.
<기본 원칙>
- 모든 HTML 태그는 요소 노드다.
- HTML 태그에서 사용하는 텍스트 내용은 자식 노드인 텍스트 노드이다.
- HTML태그에 있는 속성은 자식노드인 속성노드이다.
- 주석은 주석노드이다.
<용어정리>
parser = 번역해주는애
window = 실행해서 결과가 나오는곳
![](https://velog.velcdn.com/images/jja6312/post/9647749f-678a-4991-a699-d375247abca1/image.png)
<!-- 메인 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Include 연습 2</title>
<style>
#container{
width: 700px;
height: 400px;
margin: 0 auto;
border: 1px solid #ccc;
}
</style>
</head>
<body>
<div id="container">
<%@ include file="IncludeHeader02.jsp" %>
<p style="text-align: center; font-size:1.2em; color: blue;">방문해주셔서 감사합니다.</p>
</div>
<%@ include file="IncludeFooter02.jsp" %>
</body>
</html>
<!-- IncludeHeader02.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
int pageCnt = 0;
void addCnt(){
pageCnt++;
}
%>
<%addCnt();%>
<p style="text-align:right;">
사이트 <%=pageCnt %>번째 방문자 입니다.
</p>
<!-- IncludeFooter02.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<div style="text-align: center; font-size: 0.8em; color:gray;">Compyright ⓒ 비트캠프</div>
<c:out>
태그를 사용하는 것을 나타낸다.<!-- jstl -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그
jsp 페이지에서 페이지와 페이지 사이 제어
다른 페이지의 실행 결과 내용을 현재페이지에 포함
자바 빈즈(JavaBeans)등의 다양한 기능 제공
⇒데이터를 들고다니는 껍질
👿오늘 배운 것은
- forward 액션태그
- include 액션태그
- param 액션태그
가 있었다.
이전에 배웠던 include 디렉티브태그와 혼동하지 않게 유의가 필요했다.
액션태그는 <jsp: >형태로 시작하고, 닫아주는작업(</xxx~>)이 필요했다.
include 디렉티브태그는 <%@
forward는 해당 jsp페이지 내용을 전부 없애고
액션 태그 | 형식 | 설명 |
---|---|---|
forward | <jsp:forward page="xxx.jsp"/> | 다른 페이지로의 이동과 같은 페이지 흐름을 제어 |
include | <jsp:include page="xxx.jsp"/> | 외부 페이지의 내용을 포함하거나 페이지를 모듈화 |
useBean | jsp페이지에 자바빈즈를 설정 | |
setProperty | 자바빈즈의 프로퍼티 값을 설정 | |
getProperty | 자바빈즈의 프로퍼티 값을 얻어온다. | |
param | <jsp:forward>,<jsp:include>,<jsp:plugin> 태그에 인자를 추가한다. | |
plugin | 웹 브라우저에 자바 애플릿을 실행합니다. 자바 플러그인에 대한 object또는 embed태그를 만드는 브라우저별 코드를 생성한다. | |
element | 동적xml요소를 설정 | |
attribute | 동적으로 정의된 xml요소의 속성을 설정한다. | |
body | 동적으로 정의된 xml요소의 몸체를 설정한다. | |
text |
forward액션태그
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Action Tag</title>
</head>
<body>
<h3>이 파일은 first.jsp입니다.</h3>
<jsp:forward page="Second.jsp"/>
<!-- forward 다음에 있는 내용 -->
<p style="color:red;">===================first.jsp의 페이지입니다.====================</p>
</body>
</html>
<Second.jsp><%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Action Tag</title>
</head>
<body>
<h3>이 파일은 first.jsp입니다.</h3>
<jsp:forward page="Second.jsp"/>
<!-- forward 다음에 있는 내용 -->
<p style="color:red;">===================first.jsp의 페이지입니다.====================</p>
</body>
</html>
<jsp:include page="Second.jsp"/>
⇒첫번째 페이지 번역하고, 두번째로 넘어가서 번역하고 다시 돌아옴
flush라는것도있다.
request기본 내장 객체나 param애겻ㄴ태그를 이용하여 파라미터를 전달한다.
화면 레이아웃 일부분을 모듈화할때 주로 사용
동적 페이지에 사용
예시
<%@ include file=”파일명” %>
⇒ 첫번째 두번째 합쳐서 번역
보내주는역할 ⇒ 파람, 리퀘스트
param
액션 태그는 JSP 페이지에서 다른 페이지로 파라미터를 전달할 때 사용됩니다.
- <jsp:forward>, <jsp:include> 와 함께 사용된다.
위의 코드에서는 destination.jsp
로 페이지 전환을 하면서 id
와 name
이라는 파라미터를 함께 전달합니다. <jsp:param>
태그를 사용하여 name
속성에 파라미터 이름을, value
속성에 파라미터 값이 들어가게 됩니다.
따라서 param
액션 태그는 JSP 페이지 간에 데이터를 전달하고자 할 때 유용하게 사용됩니다. 전달된 파라미터는 대상 페이지에서 request.getParameter("파라미터이름")
을 통해 가져올 수 있습니다.
Java 언어에서 재사용 가능한 컴포넌트를 개발하기 위한 규약과 관례
필드를 꺼내서 담는다.
DTO; data transfer object
자바빈즈 - DB간..
DAO;Data Access Object
데이터베이스와의 상호작용을 추상화하고 캡슐화하는 객체 지향적인 방식을 제공하는 디자인 패턴
- 데이터베이스와의 통신을 처리하기 위한 일련의 메서드를 제공
- 데이터베이스와의 접근을 추상화하여 클라이언트 코드와 데이터베이스 구현 간의 결합도를 낮춘다.
- 도메인 모델과 데이터베이스 사이의 매핑(Mapping)을 처리
- 데이터베이스 연산에 대한 일관된 인터페이스를 제공하며, 중복 코드를 줄이고 유지보수성을 향상
데이터 전달을 위한 객체
주요 특징 및 목적
인수가 없는 기본 생성자(default생성자)가 있어야함.
모든 멤버변수인 프로퍼티는 private 접근지정자로 설정
모든 멤버 변수인 프로퍼티는 getter/setter( ) 메소드가
존재해야함
- getter( ) 메소드는 멤버 변수에 저장된 값을 가져올 수 있는 메
서드
- setter( ) 메소드는 멤버 변수에 값을 저 장할 수 있는 메서드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Action Tag - Use Bean</title>
</head>
<body>
<!-- String s = new String();
s의 역할을 하는 것이 id의 person
useBean코드는 아래태그와 같다!!
Person person = new Person();
-->
<jsp:useBean id="person" class="webBoard.dto.Person" scope="request"/>
<p>아이디 : <%=person.getId() %></p><br>
<p>이름 : <%=person.getName() %></p>
<%
//setter로 변경
person.setId("20231003");
person.setName("홍길동");
%>
<!-- 출력해봄 -->
<p>아이디 : <%=person.getId() %></p><br>
<p>이름 : <%=person.getName() %></p>
</body>
</html>
```
Reader클래스는 문자 스트림을 읽기 위한 추상 클래스
서브클래스가 구현해야하는 추상메서드
package ex12;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Example05 {
public static void main(String[] args) {
FileReader fis = null;
try {
File file = new File("src\\ex12\\example03.txt");
if(!file.exists()) {
file.createNewFile();
}
fis = new FileReader(file);
int i=0;
while((i=fis.read())!=-1) {
System.out.println((char)i);
}
System.out.println("\n파일 읽기 성공");
}
catch(Exception e){
System.out.println(e.getMessage());
}
finally {
try {
if( fis!= null) {
fis.close();
}
}
catch(IOException e) {
System.out.println(e.getMessage());
}
}
}
}
문자 기반 입력 스트림에서 텍스트를 읽는데 사용된다.
readLine()메서드로 데이터를 한 줄씩 읽을 때 사용할 수 있어 성능을 빠르게 한다.
BufferedReader 예시
package ex12;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Example06 {
public static void main(String[] args) {
FileReader fis = null;
BufferedReader br = null;
try {
File file = new File("src\\ex12\\example03.txt");
if(!file.exists()) {
file.createNewFile();
}
fis = new FileReader(file); //데코레이션패턴. 디자인 패턴 중 하나.
br = new BufferedReader(fis);
String str;
while((str=br.readLine())!=null) {
System.out.println(str);
}
System.out.println("\n파일 읽기 성공");
}
catch(Exception e) {
System.out.println(e.getMessage());
}
finally {
if(fis!=null) {
try {
fis.close();
}
catch(IOException e) {
System.out.println(e.getMessage());
}
}
if(br!=null) {
try{br.close();
}
catch(IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
//파일 - 파일리더 - 버퍼드리더 순서로 싸고있다. 그래서 br은 파일기능,파일리더기능,버퍼드리더기능을 다 가질 수 있는거다.
관계도
클래스들을 표준화한 프로그래밍방식
추가 검색 삭제가 있다.
추가 삭제 검색 정렬X
합집합,교집합구할 때 좋다.
해쉬맵 동기화 되어있음.
해쉬테이블 동기화 안되어있음
장점
- 크기 조절
ArrayList
는 요소의 개수에 따라 크기가 자동으로 조절됩니다. 요소를 추가하거나 삭제할 때 자동으로 크기가 조절되므로, 크기를 직접 관리할 필요가 없습니다.- 삽입과 삭제의 효울성
ArrayList
는 내부적으로 배열을 사용하여 요소를 저장하기 때문에, 요소의 삽입과 삭제가 효율적으로 이루어집니다. 배열의 특정 위치에 요소를 삽입하거나 삭제할 때, 배열의 재배치가 필요한 경우에도 내부적으로 처리해줍니다.- 다양한 기능과 메서드
ArrayList
는 다양한 기능과 메서드를 제공하여 요소의 추가, 삭제, 검색, 정렬 등을 쉽게 처리할 수 있습니다. 예를 들어,add()
,remove()
,get()
,size()
등의 메서드를 활용하여 요소를 다룰 수 있습니다.- 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일
- ArrayList와 달리 Vector는 자체적으로 동기화 처리가 되어 있다.
- List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다.
- 데이터의 저장공간으로 배열을 사용한다.(배열기반)
메서드 | 설명 |
---|---|
add | 추가 |
indexOf | 검색. 객체를 찾는것 |
remove | 삭제 |
set | |
get() | 일반배열에선 [ n ]으로 요소를 봤는데, 여기선 get( n ) 이구나. |
toArray : ArrayList의 객체 배열을 반환
isEmpty :비어있는지 확인
trimToSize : 빈공간 제거
int size : 저장된 객체의 갯수 반환
배열 클래스의 소스를 보고 싶을 땐?
특징
- 변경에 유리
- 배열의 단점을 보완했음.
⇒ 배열과 달리, 불연속적으로 존재하는 데이터를 연결
- 데이터의 삭제 : 단 한번의 참조변경만으로능
링크드리스트
- 연결리스트.
- 데이터 접근성이 나쁨
더블리 링크드 리스트
- 접근성 향상
- 앞뒤로 이동이 가능.
더블리 써큘러 링크드 리스트(doubly circular linked list)
이중 원형 연결리스트
스택(Stack)
LIFO(Last In First Out) 구조
마지막에 저장된 것을 제일 먼저 꺼내게 된다.
push()
pop()
isEmpty()
스택의 메서드
큐(Queue)
큐의 메서드
데이터가 연속적인 메모리 공간에 저장되기 때문에, 추가,삭제시 데이터 index가 빈공간이 없게 이동함. 따라서 스택은 배열로 만드는 것이 유리함.
스택 ⇒ 배열로 만드는 것이 유리하다.
왜냐하면, 스택은 LIFO(후입선출)구조이기때문에
배열에서 추가 삭제를 수행할 때 데이터의 이동이 필요 없다.
반면에 큐는 링크드리스트가 유리하다.
큐는 FIFO (선입선출) 구조이다.
따라서 첫 번째로 추가된 데이터가 첫 번째로 제거될 수 있다.
하지만 배열은 크기가 정해져있고, 첫번째 데이터가 삭제된다면 불필요한 데이터의 이동이 생긴다.
따라서 링크드리스트( 기차와같은 줄줄이소세지구조 )를 사용한다면, 첫 번째 데이터를 제거하더라도 불필요한 데이터이동이 필요하지 않을 것이다.
구조가 어떻든간에 컬렉션에 저장된 요소를 읽어오는 방법을 표준화 한것임.
위 그림은 빨간 박스의 두 줄을, 아래 한 줄의 코드로 바꿔놓은 것이다.
해시 함수에서 입력값의 범위에 비해 출력값의 범위가 좁기 때문에 각기 다른 입력 데이터에 대해 동일한 출력값이 나오는, 이른바 '충돌'이 발생할 수 있다.
⇒이를 해결하기 위해 일반적으로 해당 버킷에 데이터가 이미 있다면, 체인처럼 노드를 추가하여 다음 노드를 가리키는 방식(연결리스트)으로 구현
쉽게 말해, 각각의 버킷에 여러 데이터가 저장될 수 있으니, 하나의 버킷 자체도 배열로 구성
중복된 데이터를 제거하거나 이미 데이터가 추가되어 있는지를 검사할 때 주로 사용
set인터페이스를 구현한 클래스
Set인터페이스를 구현한 대표적인 컬렉션 클래스
순서유지하려면, LinkedHashSet클래스를 사용하면 된다.
TreeSet
범위 검색과 정렬에 유리한 클래
주요메서드 | 기능 |
---|---|
HashSet() | 생성자 |
HashSet(Collection c) | 초기용량 |
HashSet(int initialCapacity) | |
HashSet(int initialCapacity, float loadFactor) | |
boolean add(Object to) | 추가 |
boolean addAll(Collection c) | 합집합 |
boolean remove(Collection c) | 삭제 |
boolean removeAll(Collection c) | 교집합 |
boolean retainAll(Collection c) | 조건부삭제 |
void clear() | 모두삭제 |
boolean contains(Object o) | 포함 |
boolean containsAll(Collection c) | 여러객체 모두 포함 |
Iterator iterator() | |
boolean isEmpty() | 비었는지? |
int size() | 저장된 객체 수 |
Object[] toArray() | 객체 배열로 반 |
Object[] toArray(Object[] a) |
객체를 저장하기 전에 기존에 같은 객체가 있는지 확인
같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.
boolean add(Object o)는 저장할 객체의 eqluals()와 hashCode()를 호출
TreeSet과 달리 정렬이 필요함.(링크드리스트로 정렬)
equals()와 hashCode()가 오버라이딩 되어 있어야 함.
컬렉션 채우기, 복사, 정렬, 검색
컬렉션의 동기화
변경불가(readOnly)컬렉션 만들기 - unmodifiableXXX()
싱글톤 컬렉션 만들기 - singletonXXX()
배열기반의 Collection Class
- ArrayList
- ( Object 배열을 가지고 있고, 여기에 객체를 저장한다.)
- Vector
- ( Object 배열을 가지고 있고, 여기에 객체를 저장한다.)
이것을이용해 만든것이 Stack.
Vector는 Stack을가지고 구현하는 것이 유리하다.
배열의 단점 : 추가 삭제 불리
링크드리스트 : 연결기반
큐는 링크드리스트 기반으로 만든다.
검색기능을 향상시킨건 해시맵.
링크드리스트의장점+배열읮아점 = 해시맵
키값을 쌍으로 저장하는 자료구조.
트리맵
연결기반을 변형한것으로,
최대2개의노드를 연결할수있다는 특징을가지고있다.
검색,범위검색,정렬기능을향상
해시맵과 트리맵의 키부분만으로 만든 것이 해쉬셋과 트리셋
properties는 키밸류를 문자열만으로 저장.
파일의 읽기와 쓰기가 용이하다.
💡 실수로 string을넣으면 오류가난다. 특정한 데이터 타입만 넣을 수 있음!!꺾쇠 안에 넣는 것을 제네릭스라한다.
런타임에러를 컴파일에러로 끌고 오는 것.
컴파일한테 타입정보를 더 줘서 형변환에러를줄일수있게하는것.