JavaScript
in java
class Main{
↱heap 영역 안의 객체에 만들어지는 메소드
public void test(){}
public static void main(){}
↳ static 영역 안의 클래스에 만들어지는 메소드
}
in javascript
function test(){
}
const test = function(){};
const test = ()=>{};
<script>
// 기상하는 함수
function wakeUp(callback){
setTimeout(()=>{
console.log("1. 기상 완료");
callback();
},1000);
}
// 밥먹는 함수
function eatBreakfast()
}
// 학교 가는 함수
function goToSchool(){
}
wakeUp(()=>{
eatBreakfast();
});
</script>
<h3>이미지를 선택하세요</h3>
<input type="file" id="fileInput" accept="image/*" multiple>
<div id="preview"></div>
<script>
// 이미지를 선책했을 때 실행할 함수 등록
document.querySelector("#fileInput").addEventListener("change",(e)=>{
// e.target 은 "change" 이벤트가 발생한 바로 그 요소의 참조값
// 선택된 파일 객체가 들어있는 배열
// const filese = document.querySelector("#fileInput").files;
const files = e.target.files;
// FileReader 객체를 이용해서 선택한 파일 데이터를 읽어들인다
const reader = new FileReader();
// files 배열의 0 번 방에 들어 있는 파일을 DataURL 형식으로 읽어들기ㅗ
reader.readAsDataURL(files[0]);
// 다 읽었을 때 실행할 함수 등록
reader.onload = () => {
// 읽은 DataURL 형식의 문자열을 콘솔창에 출력하기
console.log(reader.result);
};
console.log("FileReader 객체를 이용해서 읽기 시작!");
});
</script>
➜ 밑에 있는 콘솔을 먼저 출력 = 비동기 방식
// backtic 을 이용해서 html 형식의 문자열을 구성하고
const img = `<img src="${reader.result}">`;
// id 가 preview 인 곳에 HTML 로 해석이 되도록 끼워넣는다
document.querySelector("#preview").insertAdjacentHTML("beforeend",img);
⭐ insertAdjacentHTML : HTML로 해석
<h3>이미지 2개를 선택하세요</h3>
<input type="file" id="fileInput" accept="image/*" multiple>
<div id="preview"></div>
<script>
// 이미지를 선책했을 때 실행할 함수 등록
document.querySelector("#fileInput").addEventListener("change",(e)=>{
const files = e.target.files;
// 0 번 방 이미지 로딩
const reader = new FileReader();
reader.readAsDataURL(files[0]);
reader.onload = () => {
const img = `<img src="${reader.result}">`;
document.querySelector("#preview").insertAdjacentHTML("beforeend",img);
// 1 번 방 이미지 로딩
const reader2 = new FileReader();
reader2.readAsDataURL(files[1]);
reader2.onload = () => {
const img = `<img src="${reader2.result}">`;
document.querySelector("#preview").insertAdjacentHTML("beforeend",img);
};
};
});
</script>
➜ callback 함수 지옥에 빠져들 수 있다
Promise 객체라면 or 해당 Promise 가 해결 (resolve) 되면
.then((data)=>{
여기서 Promise 객체를 또 리턴하면 두번째 then() 에 있는 함수가 호출
})
.then((data)=>{
})
<h3>이미지 2개를 선택하세요</h3>
<input type="file" id="fileInput" accept="image/*" multiple>
<div id="preview"></div>
<script>
// FileReader를 Promise 로 감싸는 함수 (Promise 객체를 리턴하는 함수)
function readFile(file){
const promise = new Promise((resolve)=>{
// 이 안에서 비동기 동작을 하고 동작이 완료되면 resolve() 함수를 호출
// 호출하면서 필요 시 매개변수에 동작의 결과 데이터를 전달 가능
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = ()=>{
// resolve() 함수를 호출하면서 읽은 결과 데이터 전달
resolve(reader.result);
};
});
return promise;
}
// 이미지를 선택했을 때 실행할 함수 등록
document.querySelector("#fileInput").addEventListener("change",(e)=>{
const files = e.target.files;
// Promise 객체를 리턴해주는 readFile() 함수를 호출하면서 file 객체 전달
readFile(files[0])
.then(data=>{
// data 는 읽은 이미지의 DataURL
const img = `<img src = "${data}">`;
document.querySelector("#preview").insertAdjacentHTML("beforeend", img);
// 두번째 Promise 객체를 리턴해준다
return readFile(files[1]);
})
.then(data=>{
const img = `<img src = "${data}">`;
document.querySelector("#preview").insertAdjacentHTML("beforeend", img);
});
});
</script>
JAVA
전제조건 : Tomcat 으로 Server 와 연동
⭐ src : java 클래스를 만들고 coding 하는 공간
webapp : 클라이언트 (웹브라우저)에게 서비스할 파일을 넣어 놓는 공간
⭣
(HTML, CSS, JavaScript, 이미지, Jsp 등)
요청 경로만 맞으면 웹 서버는 해당 컨텐츠를 찾아서 응답
run 버튼 click
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.html</title>
</head>
<body>
<h1>인덱스 페이지 입니다</h1>
<a href="study.html">공부하기</a>
<a href="sub/play.html">놀러가기</a>
<a href="images/SouthKorea.png">South Korea 이미지</a>
<br />
<img src="images/SouthKorea.png" alt="대한민국 국기" />
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>study.html</title>
</head>
<body>
<h1>공부하는 페이지</h1>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/sub/play.html</title>
</head>
<body>
<h1>노는 페이지</h1>
</body>
</html>
@charset "UTF-8";
/* webaap/css/custom.css 파일*/
h1{
color:red;
background-color:yellow;
}
<link rel="stylesheet" href="css/custom.css"/>
➜ 경로 앞에는 기본 ./ 이 생략
여기서 / 는 webapp
<link rel="stylesheet" href="../css/custom.css"/>
⭐ 상위 폴더 : ../
<li><a href="/Hello/study.html">공부하기</a></li>
<li><a href="http://localhost:8888/Hello/study.html">공부하기</a></li>
➤ 이 경로로 요청을 해서 응답되는 문자열을 css 로 평가해 해석해준다
<script src="/Hello/js/my-script.js"></script>
➤ 이 경로로 요청을 해서 응답되는 문자열을 javascript 로 해석해준다
java Resources > src/main/java 에
test.setvlet package 생성, 그 안에 FortuneServlet class 생성
<li><a href="/Hello/fortune">오늘의 운세 보기</a></li>
public class FortuneServlet extends HttpServlet{
}
public class FortuneServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
⭐ HttpServletRequest : 요청 관련
HttpServletResponse : 응답 관련
@WebServlet("/fortune")
public class FortuneServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
오늘의 운세 출력
package test.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/fortune")
public class FortuneServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 20개의 운세 목록
String[] fortunes = {
"동쪽으로 가면 귀인을 만나요!",
"서쪽으로 가면 돈을 벌 수 있어요!",
"오늘은 조심히 행동하세요.",
"뜻밖의 선물을 받게 될 거예요!",
"좋은 친구를 만나게 될 거예요.",
"지금 떠오른 생각을 실천해보세요.",
"잠시 휴식을 취해보세요.",
"계획했던 일이 순조롭게 풀려요.",
"전화 한 통이 기쁨을 가져다줄 거예요.",
"오늘은 행운의 날이에요!",
"도움이 필요한 사람을 도와보세요.",
"기대하지 않은 곳에서 기회를 얻어요.",
"옛 친구에게 연락이 올 거예요.",
"실수가 전화위복이 돼요.",
"포기하지 마세요, 좋은 일이 생길 거예요.",
"당신의 노력이 결실을 맺어요.",
"즐거운 소식이 찾아올 거예요.",
"자신감을 가지세요, 당신은 잘하고 있어요.",
"마음의 여유를 가지세요.",
"오늘은 당신 편이에요, 무엇이든 해보세요!"
};
// 랜덤하게 운세 선택
Random rand = new Random();
String fortuneToday = fortunes[rand.nextInt(fortunes.length)];
// 응답 인코딩 설정
response.setCharacterEncoding("utf-8");
// 응답 컨텐츠 설정
response.setContentType("text/html; charset=utf-8");
// 클라이언트에게 출력할 수 있는 객체의 참조값 얻어내기
PrintWriter pw = response.getWriter();
pw.println("<!doctype html>");
pw.println("<html>");
pw.println("<head>");
pw.println("<meta charset='utf-8'>");
pw.println("<title>오늘의 운세 페이지</title>");
pw.println("</head>");
pw.println("<body>");
pw.println("<p> 오늘의 운세 : "+fortuneToday+" </p>");
pw.println("<img src='/Hello/images/clover.png'>");
pw.println("</body>");
pw.println("</html>");
pw.close();
}
}
오늘의 운세 : 오늘은 행운의 날이에요!
네잎클로버 사진 출력된 상태